CM3D2 Converter.misc_OBJECT_PT_context_object
1# 「プロパティ」エリア → 「オブジェクト」タブ 2import re 3import bpy 4import mathutils 5from . import common 6from . import compat 7 8 9# メニュー等に項目追加 10def menu_func(self, context): 11 ob = context.object 12 if not ob or ob.type != 'MESH': 13 return 14 15 bone_data_count = 0 16 if 'BoneData:0' in ob and 'LocalBoneData:0' in ob: 17 for key in ob.keys(): 18 if re.search(r'^(Local)?BoneData:\d+$', key): 19 bone_data_count += 1 20 enabled_clipboard = False 21 clipboard = context.window_manager.clipboard 22 if 'BoneData:' in clipboard and 'LocalBoneData:' in clipboard: 23 enabled_clipboard = True 24 25 if bone_data_count or enabled_clipboard: 26 col = self.layout.column(align=True) 27 row = col.row(align=True) 28 row.label(text="CM3D2用ボーン情報", icon_value=common.kiss_icon()) 29 sub_row = row.row() 30 sub_row.alignment = 'RIGHT' 31 if 'BoneData:0' in ob and 'LocalBoneData:0' in ob: 32 bone_data_count = 0 33 for key in ob.keys(): 34 if re.search(r'^(Local)?BoneData:\d+$', key): 35 bone_data_count += 1 36 sub_row.label(text=str(bone_data_count), icon='CHECKBOX_HLT') 37 else: 38 sub_row.label(text="0", icon='CHECKBOX_DEHLT') 39 row = col.row(align=True) 40 row.operator('object.copy_object_bone_data_property', icon='COPYDOWN', text="コピー") 41 row.operator('object.paste_object_bone_data_property', icon='PASTEDOWN', text="貼付け") 42 row.operator('object.remove_object_bone_data_property', icon='X', text="") 43 44@compat.BlRegister() 45class CNV_OT_copy_object_bone_data_property(bpy.types.Operator): 46 bl_idname = 'object.copy_object_bone_data_property' 47 bl_label = "ボーン情報をコピー" 48 bl_description = "カスタムプロパティのボーン情報をクリップボードにコピーします" 49 bl_options = {'REGISTER', 'UNDO'} 50 51 @classmethod 52 def poll(cls, context): 53 ob = context.active_object 54 if ob: 55 if 'BoneData:0' in ob and 'LocalBoneData:0' in ob: 56 return True 57 return False 58 59 def execute(self, context): 60 output_text = "" 61 ob = context.active_object 62 pass_count = 0 63 if 'BaseBone' in ob: 64 output_text += "BaseBone:" + ob['BaseBone'] + "\n" 65 for i in range(99999): 66 name = "BoneData:" + str(i) 67 if name in ob: 68 output_text += "BoneData:" + ob[name] + "\n" 69 else: 70 pass_count += 1 71 if 10 < pass_count: 72 break 73 pass_count = 0 74 for i in range(99999): 75 name = "LocalBoneData:" + str(i) 76 if name in ob: 77 output_text += "LocalBoneData:" + ob[name] + "\n" 78 else: 79 pass_count += 1 80 if 10 < pass_count: 81 break 82 context.window_manager.clipboard = output_text 83 self.report(type={'INFO'}, message="ボーン情報をクリップボードにコピーしました") 84 return {'FINISHED'} 85 86 87@compat.BlRegister() 88class CNV_OT_paste_object_bone_data_property(bpy.types.Operator): 89 bl_idname = 'object.paste_object_bone_data_property' 90 bl_label = "ボーン情報を貼付け" 91 bl_description = "カスタムプロパティのボーン情報をクリップボードから貼付けます" 92 bl_options = {'REGISTER', 'UNDO'} 93 94 @classmethod 95 def poll(cls, context): 96 ob = context.active_object 97 if ob: 98 clipboard = context.window_manager.clipboard 99 if 'BoneData:' in clipboard and 'LocalBoneData:' in clipboard: 100 return True 101 return False 102 103 def execute(self, context): 104 ob = context.active_object 105 pass_count = 0 106 for i in range(99999): 107 name = "BoneData:" + str(i) 108 if name in ob: 109 del ob[name] 110 else: 111 pass_count += 1 112 if 10 < pass_count: 113 break 114 pass_count = 0 115 for i in range(99999): 116 name = "LocalBoneData:" + str(i) 117 if name in ob: 118 del ob[name] 119 else: 120 pass_count += 1 121 if 10 < pass_count: 122 break 123 bone_data_count = 0 124 local_bone_data_count = 0 125 for line in context.window_manager.clipboard.split("\n"): 126 if line.startswith('BaseBone:'): 127 ob['BaseBone'] = line[9:] # len('BaseData:') == 9 128 continue 129 130 if line.startswith('BoneData:'): 131 if line.count(',') >= 4: 132 name = "BoneData:" + str(bone_data_count) 133 ob[name] = line[9:] # len('BoneData:') == 9 134 bone_data_count += 1 135 continue 136 137 if line.startswith('LocalBoneData:'): 138 if line.count(',') == 1: 139 name = "LocalBoneData:" + str(local_bone_data_count) 140 ob[name] = line[14:] # len('LocalBoneData:') == 14 141 local_bone_data_count += 1 142 self.report(type={'INFO'}, message="ボーン情報をクリップボードから貼付けました") 143 return {'FINISHED'} 144 145 146@compat.BlRegister() 147class CNV_OT_remove_object_bone_data_property(bpy.types.Operator): 148 bl_idname = 'object.remove_object_bone_data_property' 149 bl_label = "ボーン情報を削除" 150 bl_description = "カスタムプロパティのボーン情報を全て削除します" 151 bl_options = {'REGISTER', 'UNDO'} 152 153 @classmethod 154 def poll(cls, context): 155 ob = context.active_object 156 if ob: 157 if 'BoneData:0' in ob and 'LocalBoneData:0' in ob: 158 return True 159 return False 160 161 def invoke(self, context, event): 162 return context.window_manager.invoke_props_dialog(self) 163 164 def draw(self, context): 165 self.layout.label(text="カスタムプロパティのボーン情報を全て削除します", icon='CANCEL') 166 167 def execute(self, context): 168 ob = context.active_object 169 pass_count = 0 170 if 'BaseBone' in ob: 171 del ob['BaseBone'] 172 for i in range(99999): 173 name = "BoneData:" + str(i) 174 if name in ob: 175 del ob[name] 176 else: 177 pass_count += 1 178 if 10 < pass_count: 179 break 180 pass_count = 0 181 for i in range(99999): 182 name = "LocalBoneData:" + str(i) 183 if name in ob: 184 del ob[name] 185 else: 186 pass_count += 1 187 if 10 < pass_count: 188 break 189 self.report(type={'INFO'}, message="ボーン情報を削除しました") 190 return {'FINISHED'}
@compat.BlRegister()
class
CNV_OT_copy_object_bone_data_property45@compat.BlRegister() 46class CNV_OT_copy_object_bone_data_property(bpy.types.Operator): 47 bl_idname = 'object.copy_object_bone_data_property' 48 bl_label = "ボーン情報をコピー" 49 bl_description = "カスタムプロパティのボーン情報をクリップボードにコピーします" 50 bl_options = {'REGISTER', 'UNDO'} 51 52 @classmethod 53 def poll(cls, context): 54 ob = context.active_object 55 if ob: 56 if 'BoneData:0' in ob and 'LocalBoneData:0' in ob: 57 return True 58 return False 59 60 def execute(self, context): 61 output_text = "" 62 ob = context.active_object 63 pass_count = 0 64 if 'BaseBone' in ob: 65 output_text += "BaseBone:" + ob['BaseBone'] + "\n" 66 for i in range(99999): 67 name = "BoneData:" + str(i) 68 if name in ob: 69 output_text += "BoneData:" + ob[name] + "\n" 70 else: 71 pass_count += 1 72 if 10 < pass_count: 73 break 74 pass_count = 0 75 for i in range(99999): 76 name = "LocalBoneData:" + str(i) 77 if name in ob: 78 output_text += "LocalBoneData:" + ob[name] + "\n" 79 else: 80 pass_count += 1 81 if 10 < pass_count: 82 break 83 context.window_manager.clipboard = output_text 84 self.report(type={'INFO'}, message="ボーン情報をクリップボードにコピーしました") 85 return {'FINISHED'}
def
execute(self, context):
60 def execute(self, context): 61 output_text = "" 62 ob = context.active_object 63 pass_count = 0 64 if 'BaseBone' in ob: 65 output_text += "BaseBone:" + ob['BaseBone'] + "\n" 66 for i in range(99999): 67 name = "BoneData:" + str(i) 68 if name in ob: 69 output_text += "BoneData:" + ob[name] + "\n" 70 else: 71 pass_count += 1 72 if 10 < pass_count: 73 break 74 pass_count = 0 75 for i in range(99999): 76 name = "LocalBoneData:" + str(i) 77 if name in ob: 78 output_text += "LocalBoneData:" + ob[name] + "\n" 79 else: 80 pass_count += 1 81 if 10 < pass_count: 82 break 83 context.window_manager.clipboard = output_text 84 self.report(type={'INFO'}, message="ボーン情報をクリップボードにコピーしました") 85 return {'FINISHED'}
Inherited Members
- bpy_types.Operator
- as_keywords
- poll_message_set
- builtins.bpy_struct
- keys
- values
- items
- get
- pop
- as_pointer
- keyframe_insert
- keyframe_delete
- driver_add
- driver_remove
- is_property_set
- property_unset
- is_property_readonly
- is_property_overridable_library
- property_overridable_library_set
- path_resolve
- path_from_id
- type_recast
- bl_rna_get_subclass_py
- bl_rna_get_subclass
- id_properties_ensure
- id_properties_clear
- id_properties_ui
- id_data
@compat.BlRegister()
class
CNV_OT_paste_object_bone_data_property88@compat.BlRegister() 89class CNV_OT_paste_object_bone_data_property(bpy.types.Operator): 90 bl_idname = 'object.paste_object_bone_data_property' 91 bl_label = "ボーン情報を貼付け" 92 bl_description = "カスタムプロパティのボーン情報をクリップボードから貼付けます" 93 bl_options = {'REGISTER', 'UNDO'} 94 95 @classmethod 96 def poll(cls, context): 97 ob = context.active_object 98 if ob: 99 clipboard = context.window_manager.clipboard 100 if 'BoneData:' in clipboard and 'LocalBoneData:' in clipboard: 101 return True 102 return False 103 104 def execute(self, context): 105 ob = context.active_object 106 pass_count = 0 107 for i in range(99999): 108 name = "BoneData:" + str(i) 109 if name in ob: 110 del ob[name] 111 else: 112 pass_count += 1 113 if 10 < pass_count: 114 break 115 pass_count = 0 116 for i in range(99999): 117 name = "LocalBoneData:" + str(i) 118 if name in ob: 119 del ob[name] 120 else: 121 pass_count += 1 122 if 10 < pass_count: 123 break 124 bone_data_count = 0 125 local_bone_data_count = 0 126 for line in context.window_manager.clipboard.split("\n"): 127 if line.startswith('BaseBone:'): 128 ob['BaseBone'] = line[9:] # len('BaseData:') == 9 129 continue 130 131 if line.startswith('BoneData:'): 132 if line.count(',') >= 4: 133 name = "BoneData:" + str(bone_data_count) 134 ob[name] = line[9:] # len('BoneData:') == 9 135 bone_data_count += 1 136 continue 137 138 if line.startswith('LocalBoneData:'): 139 if line.count(',') == 1: 140 name = "LocalBoneData:" + str(local_bone_data_count) 141 ob[name] = line[14:] # len('LocalBoneData:') == 14 142 local_bone_data_count += 1 143 self.report(type={'INFO'}, message="ボーン情報をクリップボードから貼付けました") 144 return {'FINISHED'}
def
execute(self, context):
104 def execute(self, context): 105 ob = context.active_object 106 pass_count = 0 107 for i in range(99999): 108 name = "BoneData:" + str(i) 109 if name in ob: 110 del ob[name] 111 else: 112 pass_count += 1 113 if 10 < pass_count: 114 break 115 pass_count = 0 116 for i in range(99999): 117 name = "LocalBoneData:" + str(i) 118 if name in ob: 119 del ob[name] 120 else: 121 pass_count += 1 122 if 10 < pass_count: 123 break 124 bone_data_count = 0 125 local_bone_data_count = 0 126 for line in context.window_manager.clipboard.split("\n"): 127 if line.startswith('BaseBone:'): 128 ob['BaseBone'] = line[9:] # len('BaseData:') == 9 129 continue 130 131 if line.startswith('BoneData:'): 132 if line.count(',') >= 4: 133 name = "BoneData:" + str(bone_data_count) 134 ob[name] = line[9:] # len('BoneData:') == 9 135 bone_data_count += 1 136 continue 137 138 if line.startswith('LocalBoneData:'): 139 if line.count(',') == 1: 140 name = "LocalBoneData:" + str(local_bone_data_count) 141 ob[name] = line[14:] # len('LocalBoneData:') == 14 142 local_bone_data_count += 1 143 self.report(type={'INFO'}, message="ボーン情報をクリップボードから貼付けました") 144 return {'FINISHED'}
Inherited Members
- bpy_types.Operator
- as_keywords
- poll_message_set
- builtins.bpy_struct
- keys
- values
- items
- get
- pop
- as_pointer
- keyframe_insert
- keyframe_delete
- driver_add
- driver_remove
- is_property_set
- property_unset
- is_property_readonly
- is_property_overridable_library
- property_overridable_library_set
- path_resolve
- path_from_id
- type_recast
- bl_rna_get_subclass_py
- bl_rna_get_subclass
- id_properties_ensure
- id_properties_clear
- id_properties_ui
- id_data
@compat.BlRegister()
class
CNV_OT_remove_object_bone_data_property147@compat.BlRegister() 148class CNV_OT_remove_object_bone_data_property(bpy.types.Operator): 149 bl_idname = 'object.remove_object_bone_data_property' 150 bl_label = "ボーン情報を削除" 151 bl_description = "カスタムプロパティのボーン情報を全て削除します" 152 bl_options = {'REGISTER', 'UNDO'} 153 154 @classmethod 155 def poll(cls, context): 156 ob = context.active_object 157 if ob: 158 if 'BoneData:0' in ob and 'LocalBoneData:0' in ob: 159 return True 160 return False 161 162 def invoke(self, context, event): 163 return context.window_manager.invoke_props_dialog(self) 164 165 def draw(self, context): 166 self.layout.label(text="カスタムプロパティのボーン情報を全て削除します", icon='CANCEL') 167 168 def execute(self, context): 169 ob = context.active_object 170 pass_count = 0 171 if 'BaseBone' in ob: 172 del ob['BaseBone'] 173 for i in range(99999): 174 name = "BoneData:" + str(i) 175 if name in ob: 176 del ob[name] 177 else: 178 pass_count += 1 179 if 10 < pass_count: 180 break 181 pass_count = 0 182 for i in range(99999): 183 name = "LocalBoneData:" + str(i) 184 if name in ob: 185 del ob[name] 186 else: 187 pass_count += 1 188 if 10 < pass_count: 189 break 190 self.report(type={'INFO'}, message="ボーン情報を削除しました") 191 return {'FINISHED'}
def
execute(self, context):
168 def execute(self, context): 169 ob = context.active_object 170 pass_count = 0 171 if 'BaseBone' in ob: 172 del ob['BaseBone'] 173 for i in range(99999): 174 name = "BoneData:" + str(i) 175 if name in ob: 176 del ob[name] 177 else: 178 pass_count += 1 179 if 10 < pass_count: 180 break 181 pass_count = 0 182 for i in range(99999): 183 name = "LocalBoneData:" + str(i) 184 if name in ob: 185 del ob[name] 186 else: 187 pass_count += 1 188 if 10 < pass_count: 189 break 190 self.report(type={'INFO'}, message="ボーン情報を削除しました") 191 return {'FINISHED'}
Inherited Members
- bpy_types.Operator
- as_keywords
- poll_message_set
- builtins.bpy_struct
- keys
- values
- items
- get
- pop
- as_pointer
- keyframe_insert
- keyframe_delete
- driver_add
- driver_remove
- is_property_set
- property_unset
- is_property_readonly
- is_property_overridable_library
- property_overridable_library_set
- path_resolve
- path_from_id
- type_recast
- bl_rna_get_subclass_py
- bl_rna_get_subclass
- id_properties_ensure
- id_properties_clear
- id_properties_ui
- id_data